package com.snail.ron.design.singleton;

/**
 * @author xueguoping
 * @desc: TODO 懒汉
 *
 * 线程安全的懒汉模式，比较常见的一种写法。在第一次使用的时候才进行初始化，达到了懒加载的效果；
 * 由于获取实例的静态方法用synchronized修饰，所以也没有线程安全的问题；
 * 但是，这种写法每次获取实例都要进行同步（加锁），因此效率低，并且可能很多同步都是没必要的。
 *
 * 总结：线程安全、懒加载、效率低。
 * 是否推荐：可以使用，但不推荐
 * @date 2022/4/1110:31
 */
public class SingletonTwo {
    //增加标志位 尝试抵御反射攻击
    private static boolean flag = true;
    //私有构造
    private SingletonTwo(){
        //无法拦截反射
        /*if(null != singletonTwo){
            throw new RuntimeException("禁止反射调用构造");
        }*/

        //对于懒加载，适用标识位的方式也不能保证抵御反射攻击，因为利用反射可以修改标志位
        if(flag){
            flag = false;
        }else{
            throw new RuntimeException("禁止反射调用构造");
        }
    }

    //懒汉，先声明
    private static SingletonTwo singletonTwo;

    //public方法对外提供生成实例(有线程安全问题，方法级锁)
    public static synchronized SingletonTwo getInstance(){
        if(singletonTwo == null){
            singletonTwo = new SingletonTwo();
        }
        return singletonTwo;
    }
}
